Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 20 Tastatur- und Mausereignisse
  gp 20.1 Die Tastaturschnittstelle
    gp 20.1.1 Die Tastaturereignisse im Überblick
    gp 20.1.2 Die Ereignisse »KeyDown« und »KeyUp«
    gp 20.1.3 Das Ereignis »KeyPress«
    gp 20.1.4 Die Tastaturereignisse der Form
    gp 20.1.5 Senden von Tastatureingaben
  gp 20.2 Die Mausschnittstelle
    gp 20.2.1 Die Ereignisse »MouseDown«, »MouseMove« und »MouseUp«
    gp 20.2.2 Weitere Mausereignisse
    gp 20.2.3 Die »Click«-Ereignisse
    gp 20.2.4 Eigenschaften der Maus

Kapitel 20 Tastatur- und Mausereignisse


Galileo Computing

20.1 Die Tastaturschnittstelle  downtop

Die Tastatur ist die wichtigste Eingabeschnittstelle, deren Tasten entweder mit Zeichencodes oder allgemeinen Funktionen verknüpft sind. Ganz allgemein betrachtet lassen sich die Tasten der Tastatur in vier Gruppen einteilen:

gp  Zeichentasten: Zu diesen zählen alle Tasten, mit denen Buchstaben, Zahlen und Symbole eingegeben werden können. Bei den verarbeiteten Zeichencodes handelt es sich um die Zeichen des ASCII-Zeichensatzes, die intern als 16-Bit-Unicode behandelt werden.
gp  Zustandstasten: Zu dieser Gruppe gehören drei Tasten: die (Alt)-, die (Strg)- und die (Shift)-Taste. In Kombination mit einer Zeichen- oder Funktionstaste können diese Tasten von einer eingabefähigen Komponente in einer vorgeschriebenen Weise interpretiert werden.
gp  Funktionstasten: Tasten, die dieser Gruppe zugeordnet werden, führen eine bestimmte Funktionalität aus. Dazu gehören die (Einf)-, (Pause)- und die (Entf)-Taste ebenso wie die Funktionstasten (F1) bis (F12) und die Cursortasten.
gp  Ein-/Aus-Tasten: Diese Tasten bilden die kleinste Gruppe. Zu ihnen gehören die (Num)- und die (Rollen)-Taste.

Tastatureingaben des Anwenders werden von der fokussierten Komponente entgegengenommen. Die elementarsten Reaktionen auf die Eingaben werden von der Komponente selbst ausgeführt. Beispielsweise können Sie in eine Textbox Zeichen eingeben, mit der Rücktaste das vor dem Eingabecursor stehende Zeichen löschen usw. Sollen bei einer Eingabe Reaktionen erfolgen, die über den internen Standard hinausgehen, muss das codiert werden. Damit ließe sich zum Beispiel erreichen, dass das Drücken der (F8)-Taste einen anwendungsspezifischen Dialog öffnet oder bestimmte Zeichen der Benutzereingabe nicht weiterverarbeitet werden.


Galileo Computing

20.1.1 Die Tastaturereignisse im Überblick  downtop

In der Klasse Control sind drei Ereignisse definiert, welche die Tastatureingabe behandeln: KeyDown, KeyPress und KeyUp. Allerdings veröffentlichen nicht alle von der Basisklasse Control abgeleiteten Komponenten diese drei Ereignisse, denn Voraussetzung dafür ist die Fokussierfähigkeit. Ein Label beispielsweise reiht sich zwar in die Fokussierreihenfolge ein, ist aber nicht in der Lage, Tastatureingaben zu verarbeiten.

Sehen wir uns nun zuerst die Definition der drei Tastaturereignisse an:


Public Event KeyDown As KeyEventHandler
Public Event KeyPress As KeyPressEventHandler
Public Event KeyUp As KeyEventHandler

KeyDown und KeyUp sind mit dem so genannten Tastaturcode verknüpft, der für jede Taste eindeutig festgelegt. Daher werden diese beiden Ereignisse bei einem Tastaturanschlag grundsätzlich ausgelöst:

gp  KeyDown, wenn die Taste gedrückt wird und
gp  KeyUp, wenn die Taste losgelassen wird.

Das Ereignis KeyPress tritt nach KeyDown nur dann ein, wenn der Anwender auf eine Buchstaben- oder Zifferntaste drückt. Dabei sind aber auch noch einige Sonderfälle zu berücksichtigen:

gp  Wird eine Tastenkombination aus einer oder mehreren Zustandstasten zusammen mit einer Taste für Zeichencode gedrückt, z.  B. (Shift) + (A), wird das KeyDown-Ereignis sowohl für die Zustandstaste als auch für die Zeichentaste ausgelöst. Dasselbe gilt auch für KeyUp.
gp  Hält man eine Zustandstaste längere Zeit gedrückt, tritt KeyDown wiederholt auf.
gp  Wird eine Zeichentaste längere Zeit gedrückt, schreibt sich das Zeichen wiederholt in das Ausgabeziel, beispielsweise in eine Textbox. Dabei tritt für die Dauer des Tastendrucks das Ereignispaar KeyDown/KeyPress so lange auf, bis die Taste losgelassen wird (was ein abschließendes KeyUp bewirkt).
gp  Ist in einer Textbox die Eigenschaft AcceptsTab auf True gesetzt, kann der Benutzer mit der (Tab)-Taste ein Tabstopp-Zeichen in ein mehrzeiliges Textfeld eingeben. In diesem Fall wird kein Tastaturereignis ausgelöst.
gp  KeyPress tritt nur auf, wenn das Ausgabeziel ein ASCII-Zeichen ist. Das gilt auch für den Fall, dass eine Kombination aus zwei Zustandstasten mit einer Zeichentaste gedrückt wird (z.  B. (Strg) + (Alt) + (Q) für das Zeichen @, das ist mit der Tastenkombination (AltGr) + (Q) identisch).

Galileo Computing

20.1.2 Die Ereignisse »KeyDown« und »KeyUp«  downtop

Eine Methode, die ein ausgelöstes Ereignis behandelt, muss eine Parameterliste aufweisen, die dem Typ des Delegaten des Ereignisses entspricht. Sowohl KeyDown als auch KeyUp sind vom Typ KeyEventHandler, dessen Definition wie folgt lautet:


Public Delegate Sub KeyEventHandler(Object,KeyEventArgs)

Das Objekt vom Typ KeyEventArgs, das der Ereignishandler in Empfang nimmt, enthält für uns wichtige Informationen, mit denen die Ursache der Ereignisauslösung exakt beschrieben wird.


Tabelle 20.1     Eigenschaften des Objekts »KeyEventArgs«

Eigenschaft Rückgabetyp Beschreibung
Alt Boolean Gibt an, ob die (Alt)-Taste gedrückt ist.
Control Boolean Gibt an, ob die (Strg)-Taste gedrückt ist.
Handled Boolean Gibt an, ob das Ereignis behandelt wurde, oder unterbindet dies.
KeyCode Keys Ruft den Tastencode ab, der zur Auslösung des KeyDown/KeyUp-Ereignisses geführt hat.
KeyData Keys Beschreibt alle gleichzeitig gedrückten Tasten.
KeyValue Integer Ist die Darstellung der KeyData-Eigenschaft als Ganzzahl.
Modifiers Keys Enthält die Angabe darüber, welche Zustandstasten gedrückt sind.
Shift Boolean Gibt an, ob die (Shift)-Taste gedrückt ist.
SuppressKeyPress Boolean Gibt an, ob das Ereignis an das untergeordnete Steuer-element gesendet werden soll.

Die Eigenschaften Alt, Control und Shift geben einzeln darüber Auskunft, ob die gleichnamige Zustandstaste gedrückt ist, Modifiers kombiniert diese drei Informationen in einem Wert. KeyData und KeyValue haben zwar denselben Informationsgehalt, unterscheiden sich jedoch im Typ der Rückgabe. KeyData enthält die Tastaturcodes aller gleichzeitig gedrückten Tasten und ist somit die Zusammenfassung der Eigenschaften KeyCode und Modifiers.

Die Eigenschaft »KeyCode« und die Enumeration »Keys«

Drei Eigenschaften in der Tabelle 20.1 sind von einem Typ, den wir bisher noch nicht kennen: Keys.

Jede Taste einer Tastatur wird durch eine eindeutige Zahl beschrieben, dem Tastaturcode. Die Enumeration Keys beschreibt alle denkbaren Tastencodes. Alle Konstanten hier wiederzugeben, würde einige Seiten des Buchs füllen und Sie sicherlich langweilen. Deshalb möchte ich nur die wichtigsten vorstellen, auf die Sie bei der täglichen Programmierung häufig zugreifen. Der besseren Übersicht wegen habe ich sie in mehrere logische Gruppen zusammengefasst.

Die sicherlich wichtigste Gruppe ist die der Buchstabentasten, die insgesamt 26 Mitglieder enthält.


Tabelle 20.2     Die Buchstaben in der Enumeration »Keys«

Member Enumerationswert
A 65
B 66
C 67
...  
Y 89
Z 90

Bemerkenswert ist, dass die Konstantenwerte in Keys mit den ASCII-Codes für Großbuchstaben identisch sind.

Für die Zahlentasten legt Keys die folgenden Werte fest. Auch hier stimmen die Konstantenwerte mit den ASCII-Codes überein.


Tabelle 20.3     Die Zahlen in der Enumeration »Keys«

Member Enumerationswert
D0 48
D1 49
D2 50
...  
D8 56
D9 57

In der Tabelle 20.4 sind die Werte der Zustandstasten enthalten. Die von uns üblicherweise als Alt bezeichnete Taste heißt hier Menu. Das stammt vermutlich daher, dass die (Alt)-Taste sehr häufig zur Menüauswahl eingesetzt wird. Es ließen sich sogar noch zwei ähnlich lautende Tabellen mit Konstanten für die Zustandstasten angeben, die dazu dienen, zwischen der linken bzw. rechten Anordnung zu unterscheiden. Allerdings dürfte das in der Praxis nur wenig Bedeutung haben.


Tabelle 20.4     Die Zustandstasten in der Enumeration »Keys«

Member Enumerationswert
ShiftKey 16
ControlKey 17
Menu 18

Sehr häufig anzutreffen sind die hinter den Funktionstasten befindlichen anwendungsspezifischen Funktionalitäten. Vielleicht wundern Sie sich, dass Konstanten für insgesamt 24 Funktionstasten definiert sind. Tatsächlich gibt es aber auch solche Tastaturen, obwohl zwölf Funktionstasten derzeit der De-facto-Standard sind.


Tabelle 20.5     Die Enumerationswerte der Funktionstasten

Member Enumerationswert
F1 112
F2 113
...  
F23 134
F24 135

Bei diesen Tabellen wollen wir es belassen. Wenn Sie über die anderen Tasten die Konstantenbezeichner erfahren wollen, sollten Sie in der Dokumentation der Keys-Enumeration nachlesen.

Wie man mit den Keys-Konstanten arbeitet, zeigt das folgende Beispiel eines Fensters, das eine Textbox (Name = txtWindowState) enthält. Die Benutzereingabe wird im Ereignis KeyDown überprüft. Gibt der Anwender einen der Buchstaben M, N oder I ein, wird je nach Buchstabe die WindowState-Eigenschaft der Form auf maximiert, minimiert oder normal eingestellt.


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 20\KeyDownDemo
' ----------------------------------------------------------
Public Class Form1
Private Sub txtChangeWindowState_KeyDown(ByVal sender _
As Object, ByVal e As KeyEventArgs) _
Handles txtChangeWindowState.KeyDown
If (e.KeyCode = Keys.N) Then
Me.WindowState = FormWindowState.Normal
ElseIf (e.KeyCode = Keys.M) Then
Me.WindowState = FormWindowState.Maximized
ElseIf (e.KeyCode = Keys.I) Then
Me.WindowState = FormWindowState.Minimized
End If
End Sub
End Class

Der Tastencode wird mit der Eigenschaft KeyCode des KeyEventArgs-Objekts abgefragt. Es spielt dabei keine Rolle, ob der Anwender die Zeichen als Groß- oder Kleinbuchstaben eingibt, denn ausschlaggebend ist einzig und allein die gedrückte Taste und nicht das Zeichen. Ist eine Unterscheidung zwischen Groß- und Kleinschreibung zwingend notwendig, gibt es zwei Alternativen: Entweder wird der Zustand der (Shift)-Taste abgefragt oder – was einfacher ist – es wird nicht das Ereignis KeyDown, sondern das Ereignis KeyPress behandelt.

Die Eigenschaft »KeyData«

Weiter oben haben Sie gesehen, dass drei Eigenschaften der KeyEventArgs-Klasse vom Typ Keys sind und unterschiedliche Tastenzustandsinformationen liefern: KeyCode, KeyData und Modifiers. Sie wissen inzwischen auch, dass jeder Tastendruck die Ereigniskette KeyDown und KeyUp zur Folge hat. Im Beispiel KeyDownDemo wurde die Eigenschaft KeyCode dazu benutzt festzustellen, welche Zeichentaste zum Ereignis KeyDown führte.

Werden mehrere Tasten gedrückt, löst jede gedrückte Taste ein KeyDown-Ereignis aus. Bei der Untersuchung einer Tastenkombination interessiert aber nicht die einzelne Taste, sondern die Gesamtheit aller gleichzeitig gedrückten. Um diese Information zu erhalten, wertet man die Bitmaske der vier Byte großen Eigenschaft KeyData aus. Die beiden untersten Bytes beschreiben, welche Tasten der Anwender gedrückt hält. Hiervon sind nur die Zustandstasten (Alt), (Strg) und (Shift) ausgenommen, deren Zustand den oberen beiden Bytes zu entnehmen ist.

Dazu ein Beispiel. Die Taste (F9) wird durch die Zahl 120 beschrieben, deren Bitmuster


0111 1000

ist und hexadezimal 0x0078 lautet.

Vorausgesetzt, es ist nur eine Taste gedrückt, hat KeyData denselben Inhalt wie KeyCode. Wird beispielsweise nur die (F9)-Taste gedrückt, führen die beiden folgenden Codefragmente demnach gleichermaßen zum Schließen der aktuellen Form:


If e.KeyCode = Keys.F9 Then
Me.Close()
End If

oder


If e.KeyData = Keys.F9 Then
Me.Close()
End If

Wie erwähnt, repräsentiert KeyData eine vier Byte große Bitmaske, von der die beiden obersten Bytes die Zustandstasten beschreiben. In Tabelle 20.4 finden wir zwar im Zusammenhang mit den Zustandstasten drei Keys-Mitglieder (ShiftKey, ControlKey und Menu) aufgeführt, allerdings sind deren Werte in den beiden untersten Bytes angesiedelt und für die Auswertung von KeyData bedeutungslos. Deshalb enthält die Keys-Enumeration noch vier weitere Mitglieder.


Tabelle 20.6     Die Werte der Zustandstasten, wenn eine Tastenkombination überprüft werden soll

Member Enumerationswert
None 0 bzw. 0x00000000
Shift 65536 bzw. 0x00010000
Control 131072 bzw. 0x00020000
Alt 262144 bzw. 0x00040000

Beachten Sie, dass der Wert für die (Alt)-Taste nun tatsächlich auch Alt heißt und nicht mehr Menu. Bemerkenswert ist, dass in Abhängigkeit von der gedrückten Zustandstaste immer nur ein ganz bestimmtes Bit im dritten Byte gesetzt wird:


Shift = 0000 0000 0000 0001 ....
Control = 0000 0000 0000 0010 ....
Alt = 0000 0000 0000 0100 ....

Sind mehrere Zustandstasten gleichzeitig gedrückt, werden die zugeordneten Bits einfach bitweise ODER-verknüpft.

Sehen wir uns nun an einem Beispiel an, wie einfach eine bestimmte Tastenkombination abgefragt werden kann. Ausgangspunkt sei die Forderung, mit der Tastenkombination (Shift) + (Alt) + (F9) das aktuelle Formular zu schließen:


Private Sub Form1_KeyDown(ByVal sender As Object, _
ByVal e As KeyEventArgs) Handles MyBase.KeyDown
If e.KeyData = (Keys.Shift Or Keys.Alt Or Keys.F9) Then
Me.Close()
End If
End Sub

Es werden die Keys-Werte der gewünschten Kombination mit dem bitweisen ODER-Operator verknüpft und das Ergebnis mit dem aktuellen Inhalt von KeyData verglichen. Stimmt die gewünschte Tastenkombination mit dem vorliegenden Bitmuster überein, wird die Methode Close auf das aktuelle Form-Objekt aufgerufen.

Die Eigenschaft »Modifiers«

Mit Modifiers werden alle drei Zustandstasten zusammen beschrieben. Das entspricht dem Inhalt der oberen beiden Bytes von KeyData. Damit gilt folgerichtig auch, dass die bitweise Verknüpfung von Modifiers und KeyCode der Inhalt von KeyData ist.

Eine ergänzende Alternative zu der Eigenschaft »Modifiers«

Die Klasse Control hält für ihre abgeleiteten Klassen eine weitere Möglichkeit bereit, den Status der drei Zustandstasten festzustellen: Es ist die statische, schreibgeschützte Eigenschaft ModifierKeys.


Public ReadOnly Property ModifierKeys As Keys

Während die Eigenschaft Modifiers der Klasse KeyEventArgs immer an das KeyDown oder KeyUp-Ereignis einer bestimmten Komponente gebunden ist, agiert die Eigenschaft ModifierKeys vollkommen ereignisunabhängig und ist somit auch unabhängig von jeglichem Steuer-element. Sie wird auf die Klasse Control aufgerufen und liefert wie Modifiers den Zustand der Tasten (Alt), (Strg) und (Shift). Damit wird es möglich, die Zustandstasten auch im Zusammenhang mit Ereignissen auszuwerten, die darüber keine Informationen liefern.

Das folgende Codefragment ist der Ereignishandler des Click-Ereignisses einer Schaltfläche. Obwohl das Ereignis keine Tastaturinformationen bereitstellt, wird ein Meldungsfenster geöffnet, wenn entweder die (Alt)- oder die (Shift)-Taste während des Klickens gedrückt ist.


Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles Button1.Click
Dim keys As Keys = Control.ModifierKeys
If (keys = keys.Alt Or keys = keys.Shift) Then
MessageBox.Show("Sie haben die Zustandstaste 'Alt' oder 'Shift' gedrückt")
End If
End Sub

Soll eine Kombination mehrerer Zustandstasten zu einem bestimmten Anwendungsverhalten führen, müssen die entsprechenden Enumerationskonstanten mit dem bitweisen Or-Operator verknüpft werden. Im folgenden Beispiel wird das Meldungsfenster nur angezeigt, wenn (Alt)- und (Shift)-Taste gleichzeitig gedrückt sind:


Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles Button1.Click
Dim keys As Keys = Control.ModifierKeys
If keys = (keys.Alt Or keys.Shift) Then
MessageBox.Show("'Alt' und 'Shift' gedrückt")
End If
End Sub

Die Eigenschaft »SuppressKeyPress«

Möchten Sie verhindern, dass eine oder mehrere Tasten vom Steuerelement empfangen und verarbeitet werden, setzen Sie im Ereignishandler SuppressKeyPress=True.


If e.KeyData = Keys.A Then
e.SuppressKeyPress = True
End If

Mit diesem Codefragment wird das Drücken der Taste (A) unterdrückt und nicht zur Verarbeitung an das Steuerelement weitergeleitet.


Galileo Computing

20.1.3 Das Ereignis »KeyPress«  downtop

Die bisher besprochenen Eigenschaften KeyDown und KeyUp behandeln ganz allgemein das Drücken einer Taste auf der Tastatur. Viele Tasten erzeugen aber Zeichencodes, die für das Ausgabeziel bestimmt sind. Bei diesen Tasten wird zwischen KeyDown und KeyUp ein weiterer Event ausgelöst: KeyPress.

Der Ereignishandler von KeyPress empfängt ein Argument vom Typ KeyPressEventArgs mit Daten zu dem Ereignis, die nur durch zwei Eigenschaften beschrieben werden: KeyChar und Handled.


Tabelle 20.7     Die Eigenschaften des Objekts »KeyPressEventArgs«

Eigenschaft Datentyp Beschreibung
Handled Boolean Gibt an, ob das Ereignis behandelt worden ist.
KeyChar Char Gibt an, welches ASCII-Zeichen der gedrückten Taste bzw. Tastenkombination, d.  h. in Kombination mit (Shift), entspricht. Diese Eigenschaft kann auch gesetzt werden.

Die Eigenschaft »KeyChar«

Die Eigenschaft KeyChar enthält das ASCII-Zeichen der gedrückten Taste.


Public Property KeyChar As Char

Um den Unterschied zwischen den Ereignissen KeyDown und KeyUp und KeyPress zu verdeutlichen, ist das Beispiel KeyDownDemo nun so umgeschrieben, dass die Benutzereingabe nicht mehr von KeyDown, sondern von KeyPress ausgewertet wird.


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 20\KeyPressDemo
' ----------------------------------------------------------
Public Class Form1
Private Sub txtChangeWindowState_KeyPress(ByVal sender _
As Object, ByVal e As KeyPressEventArgs) _
Handles txtChangeWindowState.KeyPress
If (e.KeyChar = "N"c) Then
Me.WindowState = FormWindowState.Normal
ElseIf (e.KeyChar = "M") Then
Me.WindowState = FormWindowState.Maximized
ElseIf (e.KeyChar = "I") Then
Me.WindowState = FormWindowState.Minimized
End If
End Sub
End Class

Rufen wir uns noch einmal in Erinnerung: Im Beispiel KeyDownDemo wurde nur die gedrückte Taste ausgewertet. Der Zustand der Taste (Shift) spielte dabei keine Rolle. Deshalb wurde auch nicht zwischen der Groß- und Kleinschreibung unterschieden, und das Programm reagierte in beiden Fällen gleich. KeyPress wertet jedoch den ASCII-Code aus, der bekanntlich bei den Klein- und Großbuchstaben anders ist. Der Anwender wird also gezwungen, »M« und nicht »m« einzugeben, um das Fenster zu maximieren.

Die Eigenschaft »Handled«

Normalerweise werden Tastatureingaben automatisch verarbeitet. Gibt der Anwender in einer Textbox den Buchstaben »A« ein, wird dieser sofort im Steuerelement ausgegeben. Die Tastaturereignisse sind meist dann von Interesse, wenn die Benutzereingabe ausgewertet werden muss. Das wäre zum Beispiel der Fall, wenn eine bestimmte Eingabe unterdrückt und durch eine andere ersetzt werden soll.

Nehmen wir an, dass die Eingabe eines Umlauts automatisch durch »ae«, »oe« bzw. »ue« ersetzt werden soll. Am einfachsten ist es, den Inhalt der Textbox mit der Eigenschaft SelectedText zu manipulieren, um eine Zeichenfolge direkt in die Anzeige der Textbox zu schreiben. Ist ein Teil der Zeichenfolge markiert, werden die markierten Zeichen durch die neue Zeichenfolge ersetzt, ist kein Text markiert, wird die Zeichenfolge an der aktuellen Cursorposition eingesetzt.


Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) _
Handles TextBox1.KeyPress
If (e.KeyChar = "ä"c) Then
TextBox1.SelectedText = "ae"
ElseIf (e.KeyChar = "ö"c) Then
TextBox1.SelectedText = "oe"
ElseIf (e.KeyChar = "ü"c) Then
TextBox1.SelectedText = "ue"
End If
End Sub

Geben wir in das mit textBox1 bezeichnete TextBox-Objekt »Händler« an der Tastatur ein, wird die Ausgabe jedoch Haeändler lauten. Das Programm hat zwar die Eingabe des Umlauts richtig erkannt und »ae« in die Textbox geschrieben, allerdings sorgt die automatische Eingabeverarbeitung auch dafür, dass der unerwünschte Umlaut weiterhin ausgegeben wird. Aber das war es doch nicht, was wir wirklich wollten.

Jetzt kommt die Eigenschaft Handled ins Spiel. Handled ist vom Typ Boolean und steht per Default auf False. Dahinter steckt die Aussage, dass die Komponente die Eingabeverarbeitung vornimmt. Wird Handled=True gesetzt, schalten wir die automatische Eingabeverarbeitung aus und nehmen die Ereignisbehandlung selbst in die Hand.

Damit unser Beispiel wie gewünscht arbeitet, müssen wir den Code folgendermaßen ergänzen:


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 20\HandledDemo
' ----------------------------------------------------------
Public Class Form1
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) _
Handles TextBox1.KeyPress
If (e.KeyChar = "ä"c) Then
TextBox1.SelectedText = "ae"
e.Handled = True
ElseIf (e.KeyChar = "ö"c) Then
TextBox1.SelectedText = "oe"
e.Handled = True
ElseIf (e.KeyChar = "ü"c) Then
TextBox1.SelectedText = "ue"
e.Handled = True
End If
End Sub
End Class

Die Anweisung e.Handled=True darf übrigens nicht nach der letzten if-Anweisung stehen. Wenn Sie das machen, schalten Sie – bis auf die Umlaute – die Behandlung aller anderen Zeichen ab.

Abschalten einer bestimmten Taste

Manchmal kommt es vor, dass man die Funktionalität einer bestimmten Taste nicht zulassen kann und diese deaktivieren muss. Auch hierzu bietet sich Handled an.

Im folgenden Codefragment wird die (Home)-Taste (= (Pos1)) abgeschaltet. Damit wird es dem Anwender unmöglich gemacht, den Eingabecursor an die erste Position zu setzen. Dass das mit den Steuerungstasten immer noch möglich ist, übersehen wir hierbei großzügig.


Private Sub TextBox1_KeyDown(...) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Home Then
e.Handled = True
End If
End Sub

Mit der Taste »Return« zur nächsten Textbox navigieren

Normalerweise wird mit der Tabulatortaste von einer Textbox in die nächste gesprungen. Manche Anwender verwenden aber stattdessen die (Return)-Taste. Das folgende Beispiel soll zeigen, wie das Drücken von (Return) abgefangen und das nächste Steuerelement fokussiert wird. Dabei hilft uns die Methode ProcessTabKey der Form weiter. Dieser übergeben wir Tue, um das nächste in der Fokussierreihenfolge stehende Steuerelement zu erreichen.


Private Sub TextBox1_KeyDown(ByVal sender As Object, _
ByVal e As KeyEventArgs) _
Handles TextBox1.KeyDown
If e.KeyCode = Keys.Enter Then
Me.ProcessTabKey(True)
e.Handled = True
End If
End Sub


Galileo Computing

20.1.4 Die Tastaturereignisse der Form  downtop

Als abgeleitete Klasse von Control erbt auch die Klasse Form die Tastaturereignisse. Diese werden jedoch unterdrückt, sobald die Form ein Steuerelement enthält, das selbst in der Lage ist, Tastaturereignisse zu verarbeiten. Manchmal möchte man aber bestimmte Tasten nur von der Form – in seltenen Fällen sowohl von der Form als auch von einem Steuerelement – verarbeiten lassen.

Damit das Fenster dennoch in die Lage versetzt wird, Tastaturereignisse zu empfangen, muss die Eigenschaft KeyPreview des Form-Objekts auf True gesetzt werden. Jedes Tastaturereignis wird dann zuerst von der Form entgegengenommen und erst danach vom aktiven Steuerelement. Die Ereignisfolge ist wie folgt:

1. KeyDown (Form)
       
2. KeyDown (Steuerelement)
       
3. KeyPress (Form)
       
4. KeyPress (Steuerelement)
       
5. KeyUp (Form)
       
6. KeyUp (Steuerelement)
       

Soll mit der Einstellung KeyPreview=True ausschließlich die Form für die Verarbeitung eines der drei Tastaturereignisses verantwortlich sein, muss im entsprechenden Ereignishandler der Form Handled=True gesetzt werden. Die Auslösung des entsprechenden Ereignisses des Steuerelements wird damit verhindert.


Galileo Computing

20.1.5 Senden von Tastatureingaben  toptop

Mit der statischen Methode Send der Klasse SendKeys aus dem Namespace System.Windows.Forms können Sie eine Tastatureingabe auch mittels Programmcode simulieren, z.  B.:


SendKeys.Send("Hallo")

Empfänger der Zeichenfolge ist dann das Steuerelement, das über den Eingabefokus verfügt. Damit ließe sich auch das Beispiel HandledDemo wie folgt codieren:


Private Sub TextBox1_KeyPress(...) Handles TextBox1.KeyPress
If e.KeyChar = "ä" Then
SendKeys.Send("ae")
e.Handled = True
ElseIf e.KeyChar = "ö" Then
SendKeys.Send("oe")
e.Handled = True
ElseIf e.KeyChar = "ü" Then
SendKeys.Send("ue")
e.Handled = True
End If
End Sub

Die Send-Methode nimmt eine Zeichenfolge entgegen, die in der einfachsten Form nur in Anführungsstrichen übergeben wird. Wie wir aber wissen, kann eine Tastatureingabe auch mit einer Taste erfolgen, die kein Zeichen ausgibt. Für diese Tasten gilt eine besondere Festlegung: Sie werden durch einen festgelegten Zeichencode beschrieben, der in geschweifte Klammern eingeschlossen wird. Die folgende Anweisung simuliert beispielsweise das Drücken der (F4)-Taste:


SendKeys.Send("{F4}")

Die Zeichencodes, die den einzelnen Tasten zugeordnet sind, können Sie der Dokumentation der Klasse SendKeys entnehmen.

Wollen Sie eine Tastenkombination mit den Zustandstasten (Shift), (Strg) und (Alt) simulieren, wird der jeweilige Buchstabe in runden Klammern angegeben und davor ein Codezeichen gesetzt. Die drei Codezeichen können Sie der Tabelle 20.8 entnehmen.


Tabelle 20.8     Code der Zustandstasten der Methode »SendKeys.Send«

Taste Code
Shift +
Alt %
Strg ^

Die Anweisung für die Tastenkombination (Shift) und (A) lautet dann:


SendKeys.Send("+(A)")

Neben der Methode Send enthält die Klasse SendKeys noch die Methode SendWait, die zuerst auf die vollständige Verarbeitung der Tastatureingabe wartet.

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de